package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"github.com/imroc/req"
	"github.com/widuu/gojson"
	"log"
	"net/http"
	"strconv"
	"time"
)

// GetRedisGeo 从redis里面遍历经纬度出来
func GetRedisGeo(longitude string,latitude string)string{
	f, _ := strconv.ParseFloat(longitude, 32)
	f2,_:=strconv.ParseFloat(latitude,32)
	resRadiu, err := GlobalClient.GeoRadius("key123", f, f2, &redis.GeoRadiusQuery{
		Radius:      200,    // radius表示范围距离，
		Unit:        "km",   // 距离单位是 m|km|ft|mi
		WithCoord:   true,   // 传入WITHCOORD参数，则返回结果会带上匹配位置的经纬度
		WithDist:    true,   // 传入WITHDIST参数，则返回结果会带上匹配位置与给定地理位置的距离。
		WithGeoHash: false,  // 传入WITHHASH参数，则返回结果会带上匹配位置的hash值。
		Count:       1,      // 入COUNT参数，可以返回指定数量的结果。
		Sort:        "ASC",  // 默认结果是未排序的，传入ASC为从近到远排序，传入DESC为从远到近排序。
	}).Result()
	if err != nil {
		panic(err)
	}
	if len(resRadiu)==0 {
		log.Println("resRadiu error")
	}
	var gs string
	for _, i2 := range resRadiu {
		f1 := strconv.FormatFloat(i2.Longitude, 'f', -1, 32)
		f2 := strconv.FormatFloat(i2.Latitude, 'f', -1, 32)
		gs = f1 + "," + f2
		fmt.Println("f1 = ", f1, "  f2 = ", f2)
		fmt.Println("gs = ", gs) // 取出来合理的经纬度
	}
	return gs

}
func GetRedisWeater(c *gin.Context)  {

	//longitude :=c.PostForm("longitude")
	//longitude :=c.Param("longitude")
	longitude :=c.Query("longitude")
	//longitude :=c.Query("longitude")
	latitude :=c.Query("latitude")
	//latitude :=c.Param("latitude")
	t := time.Now()
	fmt.Println(t.Format("20060102150405"))

	fmt.Println(time.Now().Format(time.RFC850),t.Unix(),"longitude = ",longitude,"  latitude = ",latitude)
	f, err := strconv.ParseFloat(longitude, 32)
	f2,_:=strconv.ParseFloat(latitude,32)
	resRadiu, err := GlobalClient.GeoRadius("key123", f, f2, &redis.GeoRadiusQuery{
		Radius:      200,    // radius表示范围距离，
		Unit:        "km",   // 距离单位是 m|km|ft|mi
		WithCoord:   true,   // 传入WITHCOORD参数，则返回结果会带上匹配位置的经纬度
		WithDist:    true,   // 传入WITHDIST参数，则返回结果会带上匹配位置与给定地理位置的距离。
		WithGeoHash: false,  // 传入WITHHASH参数，则返回结果会带上匹配位置的hash值。
		Count:       1,      // 入COUNT参数，可以返回指定数量的结果。
		Sort:        "ASC",  // 默认结果是未排序的，传入ASC为从近到远排序，传入DESC为从远到近排序。
	}).Result()
	if err != nil {
		panic(err)
	}
	var w WeatherData
	if len(resRadiu)==0 {
		c.JSON(http.StatusOK,string("error"))
	}
	// 设置了Count参数，所以只会循环一次，不用考虑太多
	for _, i2 := range resRadiu {
		f1 :=strconv.FormatFloat(i2.Longitude,'f',-1,32)
		f2 :=strconv.FormatFloat(i2.Latitude,'f',-1,32)
		gs :=f1+","+f2
		fmt.Println("f1 = ",f1,"  f2 = ",f2)
		fmt.Println("gs = ",gs)
		//val , _:=GlobalClient.Get(gs).Result()
		val ,err :=GlobalClient.Do("get",gs).Result()
		if err != nil {
			fmt.Println(err)
		}
		switch val.(type) {

		case string:

			op, _ := val.(string)
			fmt.Println("val = ",op)
			c.String(http.StatusOK,op)
		case []byte:
			json.Unmarshal(val.([]byte),&w)
		}
		//json.Unmarshal(val.([]byte),&w)
		//ret, _ :=json.Marshal(w)
	}
}
// QueryRedisWeater 从redis里面查询经纬度的对应的天气
func QueryRedisWeater(c *gin.Context)  {

	longitude :=c.PostForm("longitude")

	latitude :=c.PostForm("latitude")
	t := time.Now()
	fmt.Println(t.Format("20060102150405"))

	fmt.Println(time.Now().Format(time.RFC850),t.Unix(),"longitude = ",longitude,"  latitude = ",latitude)
	f, err := strconv.ParseFloat(longitude, 32)
	f2,_:=strconv.ParseFloat(latitude,32)
	resRadiu, err := GlobalClient.GeoRadius("key123", f, f2, &redis.GeoRadiusQuery{
		Radius:      200,     // radius表示范围距离，
		Unit:        "km",   // 距离单位是 m|km|ft|mi
		WithCoord:   true,   // 传入WITHCOORD参数，则返回结果会带上匹配位置的经纬度
		WithDist:    true,   // 传入WITHDIST参数，则返回结果会带上匹配位置与给定地理位置的距离。
		WithGeoHash: false,  // 传入WITHHASH参数，则返回结果会带上匹配位置的hash值。
		Count:       1,      // 入COUNT参数，可以返回指定数量的结果。
		Sort:        "ASC",  // 默认结果是未排序的，传入ASC为从近到远排序，传入DESC为从远到近排序。
	}).Result()
	if err != nil {
		panic(err)
	}
	var w WeatherData
	if len(resRadiu)==0 {
		c.JSON(http.StatusOK,string("error"))
	}
	// 设置了Count参数，所以只会循环一次，不用考虑太多
	for _, i2 := range resRadiu {
		f1 :=strconv.FormatFloat(i2.Longitude,'f',-1,32)
		f2 :=strconv.FormatFloat(i2.Latitude,'f',-1,32)
		gs :=f1+","+f2
		fmt.Println("f1 = ",f1,"  f2 = ",f2)
		fmt.Println("gs = ",gs)
		//val , _:=GlobalClient.Get(gs).Result()

		val ,err :=GlobalClient.Do("get",gs).Result()
		if err != nil {
			fmt.Println(err)
		}
		switch val.(type) {

		case string:

			op, _ := val.(string)
			fmt.Println("val = ",op)
			c.String(http.StatusOK,op)
		case []byte:
			json.Unmarshal(val.([]byte),&w)
		}
		//json.Unmarshal(val.([]byte),&w)
		//ret, _ :=json.Marshal(w)
	}
}
func GetReqWeater(Coordinate string) {
	s :=Segmentation(Coordinate,",")
	ws := RequestWeather(s[0],s[1])
	jsonBy ,err :=json.Marshal(ws.WeatherData)
	if err != nil {
		fmt.Println(err)
	}
	f, _ := strconv.ParseFloat(s[0], 7)
	f2, _ := strconv.ParseFloat(s[1], 7)
	_, err = GlobalClient.GeoAdd("key123", &redis.GeoLocation{
		Name:      string(jsonBy),
		Longitude: f,
		Latitude:  f2,
	}).Result()
	if err != nil {
		fmt.Println(err)
	}
	f11 :=strconv.FormatFloat(f,'f',-1,32)
	f22 :=strconv.FormatFloat(f2,'f',-1,32)
	fmt.Println("set ",f11,"+",f22,"+jsonbytes ",string(jsonBy))
	GlobalClient.Set(f11+","+f22,jsonBy,0)
}
// QueryReqWeater 根据经纬度的切片，来遍历一个小时查询一次天气数据
func QueryReqWeater(Coordinates []string) {

	for _, coordinate := range Coordinates {
		// 切割一下经纬度，由于是连在一起的
		splices := Segmentation(coordinate, ",")
		//weatherCoordinates := RequestWeather(splices[0], splices[1])
		//jsonbytes,err :=json.Marshal(weatherCoordinates.WeatherData)
	/*
		if err != nil {
			fmt.Println(err)
		}

	 */
		// GlobalClient.Set(weatherCoordinates.Coordinate,jsonbytes,0)
		f, _ := strconv.ParseFloat(splices[0], 7)
		f2, _ := strconv.ParseFloat(splices[1], 7)
		// 转化成float类型再存进去
		//fmt.Println("float to = ",f,f2)
		_, err := GlobalClient.GeoAdd("key123", &redis.GeoLocation{
			Name:      "test",
			Longitude: f,
			Latitude:  f2,
		}).Result()
		if err != nil {
			fmt.Println(err)
		}
		f11 :=strconv.FormatFloat(f,'f',-1,32)
		f22 :=strconv.FormatFloat(f2,'f',-1,32)
		 fmt.Println("set ",f11,"+",f22,"+jsonbytes ")
		// GlobalClient.Set(f11+","+f22,jsonbytes,0)
	}
}

// RequestWeather 请求得到天气数据
func RequestWeather(longitude string, latitude string)WeatherCoordinates {
	token := "fXkNLA097RitTvqa/"

	url := "https://api.caiyunapp.com/v2.5/"
	str := "/realtime.json"
	//	https://api.caiyunapp.com/v2.5/yyNLVAC1IsN7OWNf/121.6544,25.1552/realtime.jsonp?callback=MYCALLBACK
	reqStr := url + token + longitude + "," + latitude + str
	//fmt.Println("reqStr = ", reqStr)
	re, err := req.Get(reqStr)
	if err != nil {
		log.Fatal("req Get error")
	}
	fmt.Println("req :",reqStr)
	temperature := gojson.Json(re.String()).Get("result").Get("realtime").Get("temperature").Tostring()
	humidity := gojson.Json(re.String()).Get("result").Get("realtime").Get("humidity").Tostring()
	skycon := gojson.Json(re.String()).Get("result").Get("realtime").Get("skycon").Tostring()
	pressure := gojson.Json(re.String()).Get("result").Get("realtime").Get("pressure").Tostring()
	direction := gojson.Json(re.String()).Get("result").Get("realtime").Get("wind").Get("direction").Tostring()
	speed := gojson.Json(re.String()).Get("result").Get("realtime").Get("wind").Get("speed").Tostring()

	//wtemp.Coordinate=longitude+","+latitude
	var wt = WeatherData{
		Humidity:    humidity,
		Temperature: temperature,
		Skycon:      skycon,
		Pressure:    pressure,
		Direction:   direction,
		Speed:       speed,
		times: time.Now(),
	}
	var wtest = WeatherCoordinates{
		Coordinate:  longitude + "," + latitude,
		WeatherData: wt,
	}
	return wtest
}
